Skip to content

Redis基础

1.1 Redis简介

  1. Redis是一个基于内存的 key-value 结构的数据库
  2. 基于内存存储,读写性能高
  3. 单线程,每个命令具备原子性
  4. 支持数据持久化
  5. 支持主从集群、分片集群
  6. 适合存储热点数据(读写需求大的数据),如热点商品、咨询、新闻等、

1.2 Redis下载和安装(windows版)

image-20260315101030872

1.3 Redis服务配置(windows版)

所有操作需要在Redis安装目录中进行,因为没有添加环境变量

  1. 启动: redis-server.exe redis.windows.conf

    image-20260315104633585

  2. 停止:Ctrl + C

  3. 连接服务:redis-cli.exe -h [主机] -p [端口号] -a [密码] (Redis默认端口号是6379)

    image-20260315104622325

    注意:==默认情况下Redis服务是没有设置密码的==,并且Redis是没有用户的概念的,不需要提供用户名

  4. 设置密码

    • 打开Redis配置文件 redis.windows.conf

    • 寻找这一行: # requirepass foobared ,将注释去掉,foobared的位置填写密码即可

      注:如果在登录的时候没有-a授权,在操作Redis数据库的时候需要 auth [密码] 验证才可操作

  5. Redis图形化工具

    another redis desktop manager

1.4 Redis数据类型

  1. Redis存储的是key-value结构的数据,其中key是字符串类型,value有几种常用的数据类型

    • 五大基本类型

      • 字符串 string

      • 哈希 hash

      • 列表 list

      • 集合 set

      • 有序集合 sorted set / zset

    • 特殊类型

      • GEO 地理坐标

      • BitMap 基于位操作数据,二值统计

      • HyperLog 基数统计,12KB固定空间,有误差

    image-20260315113644791

1.5 Redis常用命令

1.5.1 字符串 (String)

特点:最基础的类型,二进制安全(可以存储文本、数字甚至图片序列化后的数据)。

  • SET key value:设置键值对。
  • GET key:获取值。
  • SETEX key seconds value(开发常用) 设置值的同时指定过期时间(单位:秒)。
  • SETNX key value:只有键不存在时才设置(常用于分布式锁的基础实现)。
  • INCR / DECR key:将存储的数字值加1 / 减1(原子操作,适合做计数器)。
  • MSET / MGET:批量设置或获取多个键值。

1.5.2 哈希 (Hash)

特点:类似于 Java 的 HashMap,适合存储对象。比起 String 存储 JSON 字符串,Hash 修改单个字段更省内存且方便。

  • HSET key field value:设置哈希表字段的值。
  • HGET key field:获取指定字段的值。
  • HGETALL key:获取该 Key 下所有的字段和值。
  • HDEL key field:删除一个或多个字段。
  • HKEYS key :获取哈希表中所有 field
  • HVALS key :获取哈希表中所有 value
  • HEXISTS key field:判断字段是否存在。
  • HINCRBY key field increment:给指定字段的数值加上增量。

1.5.3 列表 (List)

特点:简单的字符串列表,按插入顺序排序。可以作为 栈(Stack)队列(Queue) 使用。

  • LPUSH / RPUSH key value:从左侧 / 右侧插入元素。
  • LPOP / RPOP key:从左侧 / 右侧移除并返回第一个元素。
  • LRANGE key start stop:获取指定范围内的元素(0 -1 代表查看全部)。
  • LLEN key:获取列表长度。
  • BRPOP key timeout:阻塞式弹出,如果列表没数据会等待(常用于简单的消息队列)。

1.5.4 集合 (Set)

特点:无序且唯一。支持集合间的交集、并集、差集操作。

  • SADD key member:添加成员。
  • SMEMBERS key:返回所有成员。
  • SISMEMBER key member:判断成员是否存在(查询速度极快)。
  • SREM key member:移除成员。
  • SCARD key:获取成员总数。
  • SINTER / SUNION / SDIFF:计算多个集合的交集 / 并集 / 差集。

1.5.5 有序集合 (Sorted Set / ZSet)

特点:每个元素关联一个分数(Score),自动按分数排序。非常适合做排行榜。

  • ZADD key score member:添加成员并指定分数,或更新分数。
  • ZRANGE key start stop [WITHSCORES]:按分数从小到大返回。
  • ZREVRANGE key start stop:按分数从大到小返回。
  • ZSCORE key member:获取指定成员的分数。
  • ZRANK / ZREVRANK:获取成员的排名(从 0 开始)。
  • ZREM key member:移除成员。

1.5.6 全局通用管理命令 (必会)

这些命令不分类型,对所有 Key 都通用:

命令说明
KEYS *查看所有 Key(生产环境严禁使用,会导致阻塞)
EXISTS key检查 Key 是否存在
TYPE key查看 Key 的数据类型
DEL key删除指定的 Key
EXPIRE key seconds为 Key 设置过期时间
TTL key查看 Key 剩余的生存时间(-1 永久,-2 已过期)
DBSIZE查看当前数据库的 Key 总数
FLUSHDB清空当前数据库(慎用

1.6 在Java中操作Redis

1.6.1 Redis的Java客户端

Redis的Java客户端很多,常用的几种:

  • Jedis
  • Lettuce
  • Spring Data Redis

Spring Data Redis 是 Spring 的一部分,对 Redis 底层开发包进行了高度封装,在 Spring 项目中,可以使用 Spring Data Redis 来简化操作

1.6.2 Spring Data Redis使用方式

  • 在 SpringBoot 中使用 Redis,官方提供了一套非常成熟的方案:Spring Data Redis。它通过封装底层的 Redis 客户端(如 Lettuce 或 Jedis),让我们能像操作 Java 集合一样操作 Redis。

    1. 引入依赖

    在你的 pom.xml 中引入 Spring Boot 官方提供的 Starter。它会自动包含连接池等必要组件。

    xml
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    1. 配置连接信息

    application.yml 中配置 Redis 的地址。由于你目前是在本地开发,且之前尝试过设置密码,配置如下:

    yml
    spring:
      redis:
        host: localhost
        port: 6379
        # 如果你之前在 conf 里没设密码,这里就留空
        password: 
        database: 0 # 默认使用 0 号数据库
        lettuce:
          pool:
            max-active: 8 # 最大连接数
            max-idle: 8   # 最大空闲连接

    1. 配置序列化器(关键步骤)

    默认情况下,Spring 使用 Java 自带的序列化(JdkSerializationRedisSerializer),这会导致你在 Another Redis 里看到的 Key 是一串像 \xac\xed\x00\x05 这样的乱码。

    为了方便观察和通用性,我们通常将其配置为 JSON 序列化

    java
    @Configuration
    public class RedisConfig {
    
        @Bean
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            template.setConnectionFactory(factory);
    
            // 使用 StringRedisSerializer 来序列化 Key
            template.setKeySerializer(new StringRedisSerializer());
            template.setHashKeySerializer(new StringRedisSerializer());
    
                // 使用 GenericJackson2JsonRedisSerializer 来序列化 Value(转为 JSON 存储)
            GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();
            template.setValueSerializer(jsonSerializer);
            template.setHashValueSerializer(jsonSerializer);
    
            return template;
        }
    }

    1. 在代码中操作 Redis

    Spring 提供了两个核心工具类:

    • StringRedisTemplate:专门处理 String 类型的 Key-Value,读写速度最快。
    • RedisTemplate:可以处理复杂的 Java 对象。

    示例:在 Service 层使用

    java
    @Service
    public class DishService {
    
        @Autowired
        private RedisTemplate<String, Object> redisTemplate;
    
        public void testRedis() {
            // 1. 操作 String
            redisTemplate.opsForValue().set("shop_status", 1, 1, TimeUnit.HOURS);
            
            // 2. 操作 Hash(适合存储对象,如菜品详情)
            redisTemplate.opsForHash().put("dish:101", "name", "红烧肉");
            redisTemplate.opsForHash().put("dish:101", "price", 38);
    
            // 3. 获取数据
            Object status = redisTemplate.opsForValue().get("shop_status");
            
            // 4. 删除数据
            redisTemplate.delete("shop_status");
        }
    }

    1. 常用操作映射表

    RedisTemplate 的方法命名非常有规律,对应了 Redis 的数据结构:

    Redis 命令类型Java 操作对象示例
    StringopsForValue()set(k, v), get(k)
    HashopsForHash()put(k, f, v), get(k, f)
    ListopsForList()leftPush(k, v), rightPop(k)
    SetopsForSet()add(k, v), members(k)
    ZSetopsForZSet()add(k, v, score), range(k, s, e)

    💡 进阶:使用注解简化(Spring Cache)

    如果你觉得手动写 opsForValue 太麻烦,Spring 还提供了一套注解。只需在方法上加个注解,它会自动先查 Redis,查不到再查数据库并写入 Redis。

    java
    @Cacheable(cacheNames = "dishCache", key = "#id") // 自动缓存结果
    public Dish getById(Long id) {
        return dishMapper.getById(id);
    }

1.7 将Redis注册为Windows服务

将 Redis 注册为 Windows 服务是本地开发中提升效率的常规操作。通过这种方式,Redis 会随系统启动而在后台自动运行。

由于 Redis 官方并不正式支持 Windows,我们通常使用的是微软或 tporadowski 维护的 Windows 移植版。以下是具体操作步骤:


  1. 使用命令行注册服务

  2. 以管理员身份运行终端:按下 Win + X,选择“命令提示符(管理员)”或“终端(管理员)”。

  3. 进入 Redis 安装目录:假设你的 Redis 安装在 D:\Redis

    DOS

    d:
    cd D:\Redis
  4. 执行安装命令

    DOS

    .\redis-server --service-install redis.windows.conf --loglevel verbose
    • --service-install:表示安装为服务。
    • redis.windows.conf:指定配置文件(确保该文件在当前目录下)。
  5. 启动服务

安装成功后,你可以通过以下命令启动 Redis:

DOS

redis-server --service-start

或者直接使用 Windows 自带的服务管理命令:

DOS

net start redis

  1. 管理 Redis 服务

如果你需要停止、卸载或修改服务,可以使用以下常用命令:

操作命令
启动服务redis-server --service-start
停止服务redis-server --service-stop
卸载服务redis-server --service-uninstall
重命名服务redis-server --service-install --service-name RedisServerName

  1. 通过 GUI 界面检查状态

如果你想确认 Redis 是否真的设置成了“自动启动”:

  1. 按下 Win + R,输入 services.msc 并回车。
  2. 在列表中找到 Redis
  3. 右键选择“属性”,确保“启动类型”为“自动”。

💡 进阶建议:配合 Docker 运行(推荐)

既然你之前在 User Summary 中提到对 Docker 有兴趣,其实在 Windows 上最现代的做法是使用 Docker 容器化运行 Redis:

Bash

# 运行一个名为 redis 的容器,并设置为随机启动
docker run -d --name redis -p 6379:6379 --restart always redis

优点:不需要在 Windows 系统里安装各种环境变量和 .conf 文件,且版本切换极其方便(比如从 Redis 5 切换到 Redis 7 只需要改个标签)。

你现在是习惯在宿主机直接安装软件,还是准备尝试把整个“苍穹外卖”的中间件(MySQL, Redis, Nginx)都迁移到 Docker 中管理?